package com.ce.framework.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;


/**
 * 嫦娥软件有限公司 版权所有 2013
 * 创建人： andy
 * 创建时间： 2013-11-23 上午09:04:44
 * 功能描述：压缩解压文件工具类，只针对zip文件
 * ==================================
 * 修改历史
 * 修改人        修改时间      修改位置（函数名）
 *
 * ==================================
 */
public class ZipTools {
	
	static final int BUFFER = 2048;
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-11-23 上午09:05:07
	 * 功能描述：压缩文件
	 * 方法的参数和返回值
	 * @param zipFileName   压缩文件名，全路径
	 * @param zippedFolder  要压缩的文件夹，全路径
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static void zip(String zipFileName,String zippedFolder){
        try {
            BufferedInputStream origin = null;
//            FileOutputStream dest = new FileOutputStream("E:\\test\\myfiles.zip");
          FileOutputStream dest = new FileOutputStream(zipFileName);
            ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
                    dest));
            byte data[] = new byte[BUFFER];
//            File f = new File("e:\\test\\a\\");
            File f = new File(zippedFolder);
            File files[] = f.listFiles();

            for (int i = 0; i < files.length; i++) {
                FileInputStream fi = new FileInputStream(files[i]);
                origin = new BufferedInputStream(fi, BUFFER);
                ZipEntry entry = new ZipEntry(files[i].getName());
                out.putNextEntry(entry);
                int count;
                while ((count = origin.read(data, 0, BUFFER)) != -1) {
                    out.write(data, 0, count);
                }
                origin.close();
            }
            out.close();
        } catch (Exception e) {
           LogUtil.logError(e);
        }
    }
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-11-23 上午09:05:36
	 * 功能描述：解压文件
	 * 方法的参数和返回值
	 * @param zipFileName  要解压的文件名，全路径
	 * @param outputFolder 解压文件的目标文件夹，全路径
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static void unZip(String zipFileName,String outputFolder){
		 try {
	            ZipFile zipFile = new ZipFile(zipFileName);
	            Enumeration<?> emu = zipFile.getEntries();
	            while(emu.hasMoreElements()){
	                ZipEntry entry = (ZipEntry)emu.nextElement();
	                //会把目录作为一个file读出一次，所以只建立目录就可以，之下的文件还会被迭代到。
	                if (entry.isDirectory())
	                {
	                    new File(outputFolder + entry.getName()).mkdirs();
	                    continue;
	                }
	                BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
	                File file = new File(outputFolder + entry.getName());
	                //加入这个的原因是zipfile读取文件是随机读取的，这就造成可能先读取一个文件
	                //而这个文件所在的目录还没有出现过，所以要建出目录来。
	                File parent = file.getParentFile();
	                if(parent != null && (!parent.exists())){
	                    parent.mkdirs();
	                }
	                FileOutputStream fos = new FileOutputStream(file);
	                BufferedOutputStream bos = new BufferedOutputStream(fos,BUFFER);           
	                
	                int count;
	                byte data[] = new byte[BUFFER];
	                while ((count = bis.read(data, 0, BUFFER)) != -1)
	                {
	                    bos.write(data, 0, count);
	                }
	                bos.flush();
	                bos.close();
	                bis.close();
	            }
	            zipFile.close();
	        } catch (Exception e) {
	        	LogUtil.logError(e);
	        }
	}

}
